package m4_routting;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.Scanner;
import java.util.UUID;

//路由键模式---消费者
public class Consumer {

    public static void main(String[] args) throws Exception{

        //1.建立连接
        ConnectionFactory cf = new ConnectionFactory();
        cf.setHost("192.168.64.140");
        cf.setPort(5672);
        cf.setUsername("admin");
        cf.setPassword("admin");

        Connection conn = cf.newConnection();
        Channel ch = conn.createChannel();

        //2.消费者定义队列（随机命名，非持久，独占，mq重启后自动删除队列）
        String queueName = UUID.randomUUID().toString();

        ch.queueDeclare(queueName,false,true,true,null);

        //3.定义交换机
        ch.exchangeDeclare("direct_logs", BuiltinExchangeType.DIRECT);

        //4.将队列和交换机进行绑定
        // 要设置路由关键词，并且 1个队列 可以与 交换机 绑定多次，每次绑定指定一个 路由键（即关键词）
        //第3个参数，对于使用fanout交换机来说，写什么都无效

        //用我输入的绑定建 进行 队列与交换机的绑定
        System.out.println("输入绑定建，若有多个，用空格隔开");
        String s = new Scanner(System.in).nextLine();
        String[] a = s.split("\\s+"); //找到 s中的空格 拆分，得到字符串数组a
        //遍历这个字符串数组a
        for(String key : a){
            //数组a中的每一个元素 都是 一个绑定建
            ch.queueBind(queueName,"direct_logs",key);

        }


        System.out.println("队列和交换机已绑定！");

        //5.1定义deliverCallback和cancelCallback
        DeliverCallback deliverCallback = new DeliverCallback() {
            @Override
            public void handle(String consumerTag, Delivery message) throws IOException {
                String msg = new String(message.getBody());

                String routingKey = message.getEnvelope().getRoutingKey();

                System.out.println("收到消息： "+msg+" - 路由键： "+routingKey);
            }
        };

        CancelCallback cancelCallback = new CancelCallback() {
            @Override
            public void handle(String consumerTag) throws IOException {
                //暂时啥都不写
            }
        };


        //5.消费者去消费（处理）数据
        ch.basicConsume(queueName,true, deliverCallback,cancelCallback);

    }



}
